<?php
// подключаем библиотеки
require_once('../../../config.php');
require_once($CFG->libdir.'/adminlib.php');

$PAGE->set_context(get_system_context());
$PAGE->set_url(new moodle_url($CFG->wwwroot.'/admin/tool/cleanup/index.php'));
$PAGE->set_pagelayout('standard');

// ограничение доступа, проверка прав
require_login();
require_capability('tool/cleanup:access', get_context_instance(CONTEXT_SYSTEM));

/* Получить строку неактивных пользователей
 * @return string|bool - строку удаляемых пользователей или false
*/
function get_inactive_users_string($ulist)
{
    global $DB;
    $list = false;
    if (empty($ulist) OR !is_array($ulist))
    {
        return false;
    }
    
    foreach ( $ulist as $id )
    {
        $record = new stdClass();
        if ( $record = $DB->get_record('user', array('id' => $id)) )
        {
            $list .= "<li> login: ".$record->username." - ".$record->firstname."  ". $record->lastname 
                    ." id(".$record->id.")</li>";
        }
    }
    return $list;  
}
/* поиск неактивных пользователей
 * @return array|bool - массив пользователей или false
 */
function find_inactive_users()
{
    $list = array();
    global $CFG, $DB;
    require_once($CFG->libdir."/moodlelib.php");
    
    $table = 'user';
    // удаляем пользователей, зарегиных более полугода назад, ни разу не входивших на сайт
    $select = " timecreated < ". (time()-(3600*24*183)) ." AND lastlogin = 0
            AND lastaccess = 0 AND firstaccess = 0 AND deleted = 0 ";
    if ( !$records = $DB->get_records_select($table,$select) )
    {
        return false;
    }
    
    foreach ( $records as $record )
    {
        $list[] = $record->id;
    }
    return $list;
}
/* удаление неактивных пользователей
 * @param array $ulist - массив id пользователей или false
 * @return bool - результат удаление записей
 */
function delete_inactive_users($ulist)
{
    global $DB;
    $rez = true;
    if (empty($ulist) OR !is_array($ulist))
    {
        return false;
    }
    
    foreach ($ulist as $userid)
    {
        if ( $record = $DB->get_record('user', array('id' => $userid)) )
        {
            mtrace("User: id(".$record->id.") ".$record->firstname." ".$record->lastname." has been deleted...<br/>");
            $rez = delete_user($record) AND $rez;
        }
    }
    return $rez;
}

/* удаление файлов, превышающих допустимый размер
 * @param array $types - массив допустимых типов
 * @param int $fsize - допустимый размер файла
 * @param bool $countonly - флаг запроса на кол-во записей
 * @return bool
 */
function delete_deprecated_files($types, $fsize, $countonly=false)
{
    global $DB, $CFG;
    
    if ( empty($types) OR !is_array($types) OR intval($fsize) <= 0 )
    {
        return false;
    }
    $fsize *= 1024; 
    require_once($CFG->libdir."/filelib.php");
    // определим mime-типы по расширению
    $mimetypes = array();
    
    foreach ($types as $type)
    {
        $ext = strtolower(trim($type));
        if ($ext[0] != '.') 
        {
            $ext = '.'.$ext;
        }
        $mimetypes[] = mimeinfo('type', $ext);
        $mimetypes[ count($mimetypes)-1 ] = "'".$mimetypes[ count($mimetypes)-1 ]."'";
    }
    // удалим неизвестные типы
    $mimetypes = array_flip($mimetypes);
    unset ($mimetypes["'document/unknown'"]);
    $mimetypes = array_flip($mimetypes);
    
    if ( empty($mimetypes) )
    {
        return false;
    }
    
    // получаем список файлов
    $table = 'files';
    $str = implode(' OR mimetype = ', $mimetypes);
    $select = " filesize > {$fsize} AND ( mimetype = ".$str." ) ";
    
    if ( !$files = $DB->get_records_select($table, $select) ) 
    {
        return false;
    }
    
    if ($countonly)
    {// передан флаг - возвращаем кол-во совпавших записей
        return $DB->count_records_select($table, $select);
    }
    
    // удаление найденных файлов
    $fs = get_file_storage(); 
    foreach ( $files as $file )
    {// получаем объект файла 
        $fp = $fs->get_file($file->contextid, $file->component, $file->filearea, 
                $file->itemid, $file->filepath, $file->filename);
           
        if ($fp)
        {// файл существует - удаляем
            $fp->delete();
            mtrace("<p>This file has been deleted: ".$file->filepath.$file->filename."</p>");
        }else 
            mtrace("<p>Can't delete file: ".$file->filepath.$file->filename."</p>");
        
    }
    return true;
}
/* Удаление неактивных курсов
 * @param timestamp $edit_filter - время последнего редактирования
 * @param timestamp $view_filter - время без просмотров
 * @return array/bool - массив id удаляемых курсов или false  
 */
function find_inactive_courses($edit_filter=false, $view_filter=false)
{
    global $DB;
    $clist = array();
    // список id курсов
    $select = ' 1 ';
    if ($edit_filter)
    {// добавим филтр по времени редактирования
        $select = " timemodified < {$edit_filter} ";
    }
    
    if ( !$courses = $DB->get_records_select('course', $select, array(), '', 'id, shortname') )
    {// записей нет - выходим
        return false;
    }
    
    if ($view_filter)
    {// добавим фильтр по отсутствию просмотров за период
        foreach ( $courses as $key => $course )
        {
            $select = " time > '{$view_filter}' AND action = 'view' AND course = {$course->id} ";
            if ( $records = $DB->get_records_select('log', $select) )
            {// есть записи - курс не прошел фильтрацию, исключаем его из массива  
                unset($courses[$key]);
            }
        }
    }
    
    if (empty($courses))
    {// курсов нет - выходим
        return false;
    }
    
    foreach ( $courses as $course )
    {// находим зарегистрации на данный курс
        $cusers = array();
        if ( $enrols = $DB->get_records('enrol', array('courseid' => $course->id), '', 'id') )
        {
            foreach ( $enrols as $enrol )
            {// находим пользователей, зарегистрированных на данный курс
                $cusers = array_merge($cusers, $DB->get_records('user_enrolments', 
                        array('enrolid'=>$enrol->id), '', 'userid, enrolid' ));
            }
        }
        
        // находим среди пользователей курса учителя с правом редактирования
        $has_teacher = false;
        foreach ( $cusers as $cuser)
        {// находим учителей-участников курса
            if ( $role_assignments = $DB->get_records('role_assignments', array(
                    'roleid' => '3', 'userid' => $cuser->userid)) )
            {
                foreach ( $role_assignments as $assignment )
                {
                    if ( $context = $DB->get_record('context', array('id' => $assignment->contextid)) )
                    {// контекст назначения = контексту курса - учитель найден
                        if ($context->contextlevel == CONTEXT_COURSE)
                        {
                            $has_teacher = true;
                        }
                    }
                }
            }
        }
        
        if ( !$has_teacher AND $course->id != SITEID )
        {// учитель не найден и текущий курс не главный - курс неактивный, заносим в массив
            $clist[] = $course->id; 
        }
    }  
    return $clist;
}

/* Получение списка курсов для удаления
 * @param array $clist - массив id курсов для удаления
 * @return string/bool
 */
function get_inactive_courses_string($clist)
{
    global $DB;
    $list = false;
    if (empty($clist) OR !is_array($clist))
    {
        return false;
    }
    
    foreach ( $clist as $id )
    {
        $record = new stdClass();
        if ( $record = $DB->get_record('course', array('id' => $id)) )
        {
            $list .= "<li>".$record->fullname." id(".$record->id.")</li>";
        }
    }
    return $list;
}

/* Удаление курсов
 * @param array $clist - массив id курсов для удаления
 * @return bool
 */
function delete_inactive_courses($clist)
{
    if (empty($clist) OR !is_array($clist))
    {
        return false;
    }
                        
    foreach ( $clist as $id )
    {
        delete_course($id, true);
    }
    return true;
}

/* запуск cron
 * @return bool
 */
function tool_cleanup_cron()
{
    global $CFG;
    if ($CFG->tool_cleanup_is_cron)
    {
        mtrace("<br/>.........tool_cleanup has started.........<br/>");
        delete_inactive_users();
        mtrace("<br/>.........tool_cleanup has finished.........<br/>");
    }
    return true;
}
?>